/* 
 * File:   Paragrafo.h
 * Author: andrea
 *
 * Created on 27 giugno 2011, 10.25
 */

#ifndef PARAGRAFO_H
#define	PARAGRAFO_H

#include <iostream>
#include <string>
#include <vector>
#include <list>

using std::string;
using std::vector;
using std::ostream;
using std::list;


#include "ElementoTestuale.h"
#include "Spaziatura.h"
#include "Carattere.h"
#include "Immagine.h"

//Eccezzione nessun carattere
class no_car {};

class Paragrafo {
public:
    Paragrafo(int la):larg(la){};
    void AggiungiElemento(ElementoTestuale* e){ele.push_back(e);};
    inline friend ostream& operator<<(ostream& os,const Paragrafo& pr){
        os<<"\n Elementi del paragrafo:";
        vector<ElementoTestuale*>::const_iterator it=pr.ele.begin();
        for(;it!=pr.ele.end();++it){
            Spaziatura* e=dynamic_cast<Spaziatura*>(*it);
            if(e)
                os<<"\n\nSpaziatura di lunghezza "<< e->getLarghezza();
            else{
                Carattere* e=dynamic_cast<Carattere*>(*it);
                if(e)
                    os<<"\n\nCarattere codice "<<e->getCodice()<<" di larghezza "<<e->getLarghezza()<<" ed altezza totale "<<e->getAltezza();
                else{
                    Immagine* e=dynamic_cast<Immagine*>(*it);
                    if(e)
                        os<<"\n\nImmagine di altezza "<<e->getAltezza()<<" e di lunghezza "<<e->getLarghezza()<<"\nPath:"<<e->getPath();
                }
            }
            
        }
    }
    ElementoTestuale* searchMaxHeight() throw(no_car){
        vector<ElementoTestuale*>::const_iterator it=ele.begin();
        ElementoTestuale* maxC=0;
        int altMax=0;
        for(;it!=ele.end();++it){
            Carattere* c=dynamic_cast<Carattere *>(*it);
            if(c){
                if(altMax<c->getAltezza()){
                    altMax=c->getAltezza();
                    maxC=*it;
                }
            }
        }
        if(maxC==0)
            throw no_car();
        return maxC;
    }
    vector< list<ElementoTestuale*>* >* render(){
        vector<ElementoTestuale*>::const_iterator it=ele.begin();
        vector< list<ElementoTestuale*>* >* righe=new vector< list<ElementoTestuale*>* >;
        list<ElementoTestuale*> * riga=new list<ElementoTestuale*>;
        //larghezza rimanente del paragrafo
        int tmpl=larg;
        for(;it!=ele.end();++it){
            if(tmpl>0)
                riga->push_back((*it));  
            else{
                righe->push_back(riga);
                riga=new list<ElementoTestuale*>;
                riga->push_back((*it));
                tmpl=larg;
            }
            tmpl-=(*it)->getLarghezza();    
        }
        //L'ultima riga và inserita
        righe->push_back(riga);
        return righe;
    }
    
private:
    int larg;
    vector<ElementoTestuale*> ele;
};

#endif	/* PARAGRAFO_H */

